package Wrappers

import (
	"context"
	"fmt"
	"github.com/afex/hystrix-go/hystrix"
	"github.com/micro/go-micro/client"
)

type userWrappers struct {
	client.Client
}

func (u *userWrappers) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
	//var name string
	//name = req.Endpoint()
	//熔断器的使用 用来控制访问时间超时的 配置config
	hystrixConfig := hystrix.CommandConfig{
		Timeout:                1000, //设置hystrix的超时时间 熔断器最多等待时长
		RequestVolumeThreshold: 2,    //熔断器的请求阀值 超过设置的这个数开始计算 超过阀值则自动执行降级函数 默认为20
		ErrorPercentThreshold:  5,    //错误百分比符号为百分号 也就是超过十次之后 按照10*0.5 超过五次就直接执行降级函数 默认50%
		SleepWindow:            5000, //如果一旦触发了熔断器自动执行降级函数之后多长时间之后会再次去执行实际请求 默认为5秒
		MaxConcurrentRequests:  8000, //如果并发直接达到8000及以上则直接走自动降级函数
	}
	//配置command
	hystrix.ConfigureCommand("user", hystrixConfig) //配置命令的名称 以及配置
	return hystrix.Do("user", func() error {
		fmt.Println("请求中")
		return u.Client.Call(ctx, req, rsp)
	}, func(err error) error {
		fmt.Println("请求结束")
		return nil
	})
}

func NewUserWrappers(client client.Client) client.Client {
	return &userWrappers{client}
}
